package com.tlgen.orm.components.autoFill;

import com.tlgen.orm.enums.FillType;
import com.tlgen.orm.service.impl.EntityImpl;

import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * 批量实体生命周期执行器
 */
public class BatchLifecycleExecutor {

    /**
     * 批量执行带生命周期的操作
     */
    public static <T, R> void executeBatch(
            List<T> tList,
            FillType operationType,
            BiConsumer<T, EntityImpl<T>> beforeAction,
            Consumer<List<T>> dbAction,
            BiConsumer<List<T>, EntityImpl<T>> afterAction
    ) {
        if (tList == null || tList.isEmpty()) return;

        try {
            // 1. 设置操作上下文
            OperationContext.pushOperationType(operationType);

            // 2. 获取实体实现（只需获取一次）
            Class<?> entityClass = tList.get(0).getClass();
            @SuppressWarnings("unchecked")
            EntityImpl<T> entityImpl = (EntityImpl<T>) EntityImplHandlerLoader.getHandler(entityClass);

            // 3. 执行前置操作（批量）
            for (T entity : tList) {
                beforeAction.accept(entity, entityImpl);
            }

            // 4. 执行批量自动填充（关键优化）
            executeBatchAutoFill(tList, operationType);

            // 5. 执行数据库操作（批量）
            dbAction.accept(tList);

            // 6. 执行后置操作（批量）
            afterAction.accept(tList, entityImpl);
        } finally {
            // 7. 清除操作上下文
            OperationContext.clear();
        }
    }

    /**
     * 高性能批量自动填充
     */
    private static <T> void executeBatchAutoFill(List<T> entities, FillType operationType) {
        AutoFillHandler handler = AutoFillHandlerLoader.getHandler();
        // 批量处理优化：减少反射开销
        if (operationType == FillType.INSERT) {
            handler.saveBatch(entities);
        } else if (operationType == FillType.UPDATE) {
            handler.updateBatch(entities);
        }
    }

}